package com.example.active_record;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
//扫描接口
@MapperScan("com.example.active_record.mapper")
public class ActiveRecordApplication {

    public static void main(String[] args) {
        SpringApplication.run(ActiveRecordApplication.class, args);
    }

    //注册插件    PaginationInnerInterceptor  分页插件
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
       //分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        //防止全表更新与删除
        //interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
        // 乐观锁插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());

        return interceptor;
    }
}



/*MyBatis插件机制
MyBatis插件就是对Executor、StatementHandler、
ParameterHandler、ResultSetHandler这四个接口上的方法
进行拦截，利用JDK动态代理机制，为这些接口的实现类创建代理对象，
在执行方法时，先去执行代理对象的方法，从而执行自己编写的拦截逻辑。

Executor
MyBatis的内部执行器，它负责调用StatementHandler操作
数据库，并把结果集通过 ResultSetHandler进行自动映射。

StatementHandler
MyBatis直接让数据库执行sql脚本的对象。

ParameterHandler
MyBatis实现Sql入参设置的对象。

ResultSetHandler
MyBatis把ResultSet集合映射成POJO的接口对象
*/


/*MyBatisPlus常用插件
MyBatisPlus依据MyBatis插件机制，
为我们提供了一些开发中常用的插件，我们在开发中使用即可。

常用插件：

自动分页: PaginationInnerInterceptor
防止全表更新与删除: BlockAttackInnerInterceptor
乐观锁: OptimisticLockerInnerInterceptor
乐观锁:修改数据库中的数据时，为了避免同时被其他人修改，最好的办法就是对该数据进行加锁以防止并发。

这些插件都实现了InnerInterceptor接口*/

/*MyBatisPlus插件_乐观锁插件
修改数据库中的数据时，为了避免同时被其他人修改，
最好的办法就是对该数据进行加锁以防止并发。

锁的设计分为悲观锁和乐观锁：
悲观锁：悲观锁对数据被外界修改持保守态度。即在整个数据处理过程中，
将数据处于锁定状态。悲观锁的实现往往依靠数据库提供的锁机制。

乐观锁：乐观锁在数据进行提交更新的时候，才会正式对数据的冲突
与否进行检测，如果冲突，则返回给用户异常信息，让用户决定如何去做。

MyBatisPlus乐观锁插件实现方式：

取出记录时，获取当前version
更新时，带上这个version
执行更新时， set version = newVersion where version = oldVersion
如果version不对，就更新失败

（设置新的版本 = 更新新的版本的 条件是 当时获取到的版本 = 更新时数据库的版本，
如果不等于，更新失败）*/
